// 五、泛型

// const getArray = <T>(value: T, times: number = 5):T[] => {
//   return new Array(times).fill(value)
// }
// console.log(getArray<number>(2,3));
// console.log(getArray<string>('123',3));

// const getArray = <T, U>(param1: T, param2: U, times: number): [T, U][] => {
//   return new Array(times).fill([param1, param2])
// }
// console.log(getArray<number,string>(2, 'a',3));
// console.log(getArray<string,number>('123',2, 3));

// 泛型定义函数类型
// let getArray: <T>(arg: T, times: number) => T[]
// getArray = (arg: any, times: number) => {
//   return new Array(times).fill(value)
// }

// type GetArray = <T>(arg1: T, times: number) => T[]
// let getArray2:GetArray = (arg1: any, times: number)=>{
//   return new Array(times).fill(value)
// }
// 泛型接口
// interface GetArray <T>{
//   (arg1: T, times: number): T[],
//   array:T[]
// }

// 泛型约束
// interface ValueWithLength{
//   length:number
// }
// const getArray = <T extends ValueWithLength>(arg:T,times):T[]=>{
//   return new Array(times).fill(arg)
// }
// getArray([1,2],3)
// getArray(1,3)
// getArray({length:2},3)

// 在泛型约束中使用类型参数
// const getProps = <T,K extends keyof T>(object:T,propName:K)=>{
//   return object[propName]
// }
// const objs = {
//   a:'a',
//   b:'b'
// }
// getProps(objs,'a')
// getProps(objs,'c')




